#include "stm32f10x.h"                  // Device header


// TIM2 -> APB1 总线上的外设
void Timer_Init(void)
{
	// 开启APB1上的 TIM2 时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	// 选择时基单元的时钟为内部时钟
	TIM_InternalClockConfig(TIM2);
	
	// 配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;        // 这个是外部时钟的时候，消抖采样的频率对内部时钟的分频, 随便配置一个即可。
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;    // 向上计数
	TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1;                  // 计数重装值, ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1;                // 预分频, PSC, 注意 PSC 和 ARR 都要在 0~65535 之间, 公式: 
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;               // 高级定时器才会使用, 我们不用管
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	// 清除预分频设置的更新中断标志位, 避免上电就进入一次中断.
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	
	// 使能更新中断: 开启更新中断到 NVIC 得通路, 第三个参数是 NVIC 前面的中断输出控制
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	// NVIC 配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                 // 优先级分组
	NVIC_InitTypeDef NVIC_InitStructure; 
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                 // 定时器2 在 NVIC 里的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	// 启动定时器
	TIM_Cmd(TIM2, ENABLE);
}